package com.AI.AIDemo.Demos;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.concurrent.ArrayBlockingQueue;

/*
 * @Author:大力王
 * @Date:2025/5/2-02-7:15
 * 开始了
 */

@Slf4j
public class C4_SharedQueue {
    // 定义一个队列
    private final int MAX_SIZE = 10;

    private final ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(MAX_SIZE);

    // 生产者
    class Producer extends Thread {

        @Override
        public void run() {
                // 保证线程安全
            synchronized (queue) {
                // 判断当前队列长度是否小于 MAX_SIZE
                if (queue.size() < MAX_SIZE) {
                    // 放入队列
                    queue.add(queue.size() + 1);
                    log.info("生产者线程放入数据, 当前长度：" + queue.size());
                    // 唤醒线程
                    queue.notify();

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }else {
                    // 睡眠
                    try {
                        queue.wait();
                    } catch (InterruptedException e) {
                        queue.notify();
                        throw new RuntimeException(e);
                    }
                }
                // 如果小于 MAX_SIZE 则放入队列
                // 如果大于 MAX_SIZE 则睡眠

            }
        }
    }

    // 消费者
    class Consumer extends Thread {

        private volatile boolean running = true;

        @Override
        public void run() {

            //  循环消费
            while (running){
                // 保证线程安全
                synchronized (queue) {
                    // 判断队列是否为空 如果为空则睡眠
                    if (queue.isEmpty()) {
                        try {
                            queue.wait();
                            log.info("队列为空，消费者线程等待");
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt(); // 重新设置中断状态
                            // 可选：退出循环
                            running = false;
                            queue.notify();
                        }
                    }else {
                        // 如果不为空 则从队列中取出数据

                        Integer data = queue.poll();
                        log.info("消费者线程开始消费,消费的信息为:"+ data + ",当前队列长度为:"+queue.size());

                        // 唤醒线程
                        queue.notify();

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        log.info("开始"+ Arrays.toString(args));

        if (args.length > 0 && "debug".equals(args[0])) {
            System.out.println("进入调试模式");
        } else {
            System.out.println("进入普通模式");
        }

        C4_SharedQueue c4_sharedQueue = new C4_SharedQueue();

        c4_sharedQueue.new Consumer().start();

        for (int i = 0; i < 12; i++) {
            c4_sharedQueue.new Producer().start();
        }
    }
}
